package 剑指offer;

import java.util.Scanner;

/** 

* @author ：soulstones
* @version ：2019年9月30日 下午9:35:45 
* @Description：
* 
输入一个整数，输出该数二进制表示中1的个数。其中负数用补码表示。
*/
public class A11二进制中1的个数 {

	//一般思路
	/*
	 * 在计算机啊中，整数的存储和运算都是其补码表示的

正数右移：保持为正数，相当于/2。

负数右移：保持为负数，移位前是负数，移位后保持是负数，因此移位后最高位设为1。如果一直右移，最终会变成-1，即(-1)>>1是-1。

正数左移：不一定保持为正数，相当于*2。（注意：1左移31时为负数最大值）

负数左移：不一定保持为负数，在左移的过程中会有正有负的情况。所以切记负数左移不会特殊处理符号位。如果一直左移，最终会变成0。
	 */
	
	public static int count1Num(int n) {
		int num=0,flag=1;
		while(flag!=0) {
			if ((n&flag)!=0) {
				num++;
			}
			flag<<=1;
		}
			return num;
	}
	
	
	
	
	//独特思路
	 public static int NumberOf1(int n) {
		 int count=0;
		 while (n!=0) {
			count++;
			n=n&(n-1);
		}
		 return count;
	 }
	 
	 
	 
	 
	 
	 public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		System.out.println(NumberOf1(n));
	}
}
